{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "5e0cf2a9-b782-48de-ac45-128726a26e64",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "import yaml\n",
    "from pathlib import Path\n",
    "import os\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "7ea3e149-ce6f-4ba0-aa41-e0501a04efe3",
   "metadata": {},
   "outputs": [],
   "source": [
    "def saveFig(name, fig):\n",
    "    fig.savefig(\n",
    "        name,\n",
    "        dpi=None,\n",
    "        facecolor=fig.get_facecolor(),\n",
    "        edgecolor=\"none\",\n",
    "        orientation=\"portrait\",\n",
    "        format=\"png\",\n",
    "        transparent=False,\n",
    "        bbox_inches=\"tight\",\n",
    "        pad_inches=0.2,\n",
    "        metadata=None,\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "4b010856-0d99-4d81-8fb0-7a927f10eeaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Update the path belows to the directories containing the results for FedPFT and FedAvg\n",
    "path_fedpft_resutls_cifar100 = os.path.join(os.path.realpath('..'),'outputs','2024-04-14','16-36-16')\n",
    "path_fedpft_resutls_caltech101 = os.path.join(os.path.realpath('..'),'outputs','2024-04-14','16-44-20')\n",
    "\n",
    "path_fedavg_resutls_cifar100 = os.path.join(os.path.realpath('..'),'outputs','2024-04-14','23-24-25')\n",
    "path_fedavg_resutls_caltech101 = os.path.join(os.path.realpath('..'),'outputs','2024-04-14','22-32-11')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2e3e165c-1ce6-4efa-a4e1-1372586e436e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load results\n",
    "def read_accuracies(path_to_pickle):\n",
    "    for result in list(Path(path_to_pickle).glob(\"*.pkl\")):\n",
    "        with open(result, \"rb\") as handle:\n",
    "            data = pickle.load(handle)\n",
    "\n",
    "        accuracies = data['history'].metrics_distributed['accuracy']\n",
    "        return accuracies\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "77b70c73",
   "metadata": {},
   "outputs": [],
   "source": [
    "fedpft_cifar = read_accuracies(path_fedpft_resutls_cifar100)\n",
    "fedpft_caltech = read_accuracies(path_fedpft_resutls_caltech101)\n",
    "fedavg_cifar = read_accuracies(path_fedavg_resutls_cifar100)\n",
    "fedavg_caltech = read_accuracies(path_fedavg_resutls_caltech101)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "e1a678de",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x200 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "color1 = 'blue'\n",
    "color2 = 'red'\n",
    "\n",
    "def viz():\n",
    "    fig, axs = plt.subplots(figsize=(10, 2), nrows=1, ncols=2)\n",
    "    \n",
    "    # cifar100\n",
    "    axs[0].plot([r for r, _ in fedavg_cifar], [a for _, a in fedavg_cifar], label='FedAvg', color=color1, linewidth=2.0)\n",
    "    axs[0].scatter([r for r, _ in fedpft_cifar], [a for _, a in fedpft_cifar], label='FedPFT', color=color2, marker='x', s=100)\n",
    "    axs[0].set_title('CIFAR100 - ResNet50')\n",
    "    axs[0].set_ylim(0, 0.7)\n",
    "    \n",
    "    # caltech101\n",
    "    axs[1].plot([r for r, _ in fedavg_caltech], [a for _, a in fedavg_caltech], label='FedAvg', color=color1, linewidth=2.0)\n",
    "    axs[1].scatter([r for r, _ in fedpft_caltech], [a for _, a in fedpft_caltech], label='FedPFT', color=color2, marker='x', s=100)\n",
    "    axs[1].set_title('Caltech101 - Clip/ViT-B')\n",
    "    axs[1].set_ylim(0.2, 1)\n",
    "    \n",
    "    for ax in axs:\n",
    "        ax.set_xticks([1, 5, 10 , 15, 20])\n",
    "        ax.grid()\n",
    "        ax.legend(fontsize=14, loc='lower right')\n",
    "        ax.set_xlabel(\"Round\", fontsize=14)\n",
    "        ax.set_ylabel(\"Accuracy\", fontsize=14)\n",
    "\n",
    "    return fig\n",
    "\n",
    "f = viz()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "92460065",
   "metadata": {},
   "outputs": [],
   "source": [
    "saveFig(\"FedPft.png\", f)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
